import axios from "axios"
import qs from "qs" // 引入qs模块，用来序列化post类型的数据
// import { showMessage } from "./status"
// import { showLoadingToast, closeToast } from "vant"
import { showLoading, hideLoading } from "@/request/loading.js"
export const ZYContentType = {
  // application/x-www-from-urlencoded，会将表单内的数据转换为键值对，比如,name=Java&age = 23
  fromUrlencoded: "application/x-www-form-urlencoded; charset=UTF-8",
  // multipart/form-data,它会将表单的数据处理为一条消息，以标签为单元，用分隔符分开。既可以上传键值对，也可以上传文件。当上传的字段是文件时，会有Content-Type来说明文件类型；content-disposition，用来说明字段的一些信息；
  formData: "multipart/form-data",
  // (raw json)
  rawJSON: "application/json",
  // (raw text)
  rawText: "text/plain"
}
// axios.defaults.baseURL = import.meta.env.VITE_APP_HOST
axios.defaults.withCredentials = true // Cookie跨域
// 创建axios实例
var instance = axios.create({ timeout: 50000 })
// 请求拦截
instance.interceptors.request.use(
  (config) => {
    // 设置token
    config.data = qs.stringify(config.data) // 转为formdata数据格式
    config.headers = {
      "Content-Type": ZYContentType.fromUrlencoded
      // 'Access-Control-Allow-Origin':'*'
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截
instance.interceptors.response.use(
  (response) => {
    if (response.status === 200) {
      return Promise.resolve(response.data)
    } else {
      return Promise.reject(response)
    }
  },
  (error) => {
    const { response } = error
    if (response) {
      // 请求已发出，但是不在2xx的范围
      // showMessage(response.status) // 传入响应码，匹配响应码对应信息
      return Promise.reject(response.data)
    } else {
      console.log("网络连接异常,请稍后再试!")
    }
  }
)

export const request = {
  /*
   * method: 请求方式
   * url: 请求地址
   * params: 参数，添加到url的请求字符串中的，用于get请求
   * data: 参数，添加到请求体body中的， 用于post等请求
   * headers: 请求头
   * contentType: 参数报文格式，默认application/json，放在header中
   * showLoading: 是否显示loading
   * responseType: 响应类型
   */
  request: function (parameters) {
    const method = parameters.method
    const api = parameters.api
    const params = parameters.params
    const showLoading = parameters.showLoading
    var data = parameters.data
    // var headers = parameters.headers || {}

    return new Promise((resolve, reject) => {
      if (showLoading) {
        // showLoadingToast({
        //   message: "加载中...",
        //   forbidClick: true,
        //   duration: 0
        // })
        showLoading()
      }
      // 设置公共请求头
      instance
        .request({
          method: method,
          url: api,
          // headers: { "Content-Type":  ...headers }, //token, accessToken
          params: params,
          data: data
        })
        .then(function (res) {
          // closeToast()
          hideLoading()
          if (typeof res === "string") {
            var result = JSON.parse(data)
            resolve(result)
          } else if (typeof res === "object") {
            resolve(res)
          } else {
            resolve(res)
          }
        })
        .catch((err) => {
          // closeToast()
          hideLoading()
          reject(err)
        })
    })
  },

  get: function (parameters) {
    return this.request({
      ...parameters,
      method: "get"
    })
  },
  post: function (parameters) {
    return this.request({
      ...parameters,
      method: "post"
    })
  }
}
